﻿#region << 版 本 注 释 >>
/*----------------------------------------------------------------
// Copyright (C) 2021 kingerrobot
// 版权所有。 
//
// 文件名：BRcsEquipCrn
// 文件功能描述：
//
// 创建者：名字 (zzl)
// 时间：2021/12/15 8:58:10
//
// 修改人：
// 时间：
// 修改说明：
// 版本：V1.0.0
//----------------------------------------------------------------*/
#endregion

namespace KingerRobot.MexicoSailunMDC.SpiService;
internal class BRcsEquipCrn : IRcsEquipCrn
{
    private readonly static ITask _Task = new BTask();
    private readonly static ITaskCmd _TaskCmd = new BTaskCmd();

    private readonly static IRcsEquip _RcsEquip = new BRcsEquip();

    public List<CrnForkInfo> GetCrnFork()
    {
        // 获取所有堆垛机
        var rcsEquipCrns = GetRcsEquipCrn();

        // 过滤堆垛机
        return GetCrnForkFilter(rcsEquipCrns);
    }



    public PORcsEquipCrn GetCrnForkByFork(long fork)
    {
        var db = Db.Default;
        var result = db.RcsEquipCrns.Where(t => t.CrnFork1 == fork || t.CrnFork2 == fork).FirstOrDefault();
        return result;
    }

    public PORcsEquipCrn GetCrnForkById(long? id)
    {
        var db = Db.Default;

        var result = db.RcsEquipCrns.Join(db.RcsEquips, f => f.Id, s => s.Id, (f, s) => new
        {
            Crn = f,
            Equip = s,
        }).Where(t => t.Equip.EquipEnable == 1 && t.Crn.Id == id)
        .Select(t => t.Crn).FirstOrDefault();
        return result;
    }

    public List<PORcsEquipCrn> GetRcsEquipCrn()
    {
        var db = Db.Default;
        var result = db.RcsEquipCrns.Where(t => t.UseFlag == 1).ToList();
        return result;
    }
    public List<PORcsEquipCrn> GetRcsEquipCrnById(long id)
    {
        var db = Db.Default;
        var result = db.RcsEquipCrns.Where(t => t.UseFlag == 1 && t.Id == id).ToList();
        return result;
    }

    public List<CrnForkInfo> GetUsableCrnFork()
    {
        // 所有可用堆垛机、货叉
        var forks = GetCrnFork();

        // 查找所有可执行指令
        var taskCmds = _TaskCmd.GetExecutableTaskCmds();

        // 将正在执行任务标识设为 false
        forks.ForEach(item =>
        {
            item.TaskCount = 0;
            if (item.IsEnable == true)
            {
                //OLDTODO 【已解决】确认都应该是 StartEquip （入库和出库开始设备都是 StartEquip = Fork）
                var taskCmd = taskCmds.Where(t => t.EquipId == item.Fork.GetValueOrDefault()).FirstOrDefault(); //  _TaskCmd.GetExecutableTaskCmdByEquipId(item.Fork.GetValueOrDefault());
                if (taskCmd != null)
                {
                    item.TaskCount = 1;
                    // 另一只货叉
                    var fork = forks.Where(t => t.IsEnable == true && t.Fork != item.Fork && t.CrnId == item.CrnId).FirstOrDefault();
                    if (fork != null)
                    {
                        fork.TaskCount = item.TaskCount;
                    }
                }
            }
        });

        return forks;
    }

    public int UpdateCrnType(long id, int type)
    {
        var db = Db.Default;
        var result = db.RcsEquipCrns.Where(t => t.Id == id).Update( new PORcsEquipCrn
        {
            NowTaskType = type,
            UpdateTime = DateTime.Now,
        });
        return db.SaveChanges();
    }



    /// <summary>
    /// 过滤获取可用的堆垛机和货叉
    /// </summary>
    /// <param name="rcsEquipCrns"></param>
    /// <returns></returns>
    private List<CrnForkInfo> GetCrnForkFilter(List<PORcsEquipCrn> rcsEquipCrns)
    {
        List<CrnForkInfo> pORcsEquipCrnForks = new();

        var abnormal = _RcsEquip.GetAbnormalEquipAll();

        rcsEquipCrns.ForEach(item =>
        {
            // 一号货叉
            CrnForkInfo crnForkInfo1 = new()
            {
                CrnArea1 = item.CrnArea1,
                CrnArea2 = item.CrnArea2,
                WarehourseId = item.WarehourseId.GetValueOrDefault(),
                CrnId = item.Id,
                Fork = item.CrnFork1,
                IsEnable = true,
                Index = 1,
            };
            // 二号货叉
            CrnForkInfo crnForkInfo2 = new()
            {
                CrnArea1 = item.CrnArea1,
                CrnArea2 = item.CrnArea2,
                WarehourseId = item.WarehourseId.GetValueOrDefault(),
                CrnId = item.Id,
                Fork = item.CrnFork2,
                IsEnable = true,
                Index = 2,
            };

            var crn = abnormal.Where(t => t.Id == item.Id).Any();
            if (crn)
            {
                // 堆垛机异常
                crnForkInfo1.IsEnable = false;
                crnForkInfo2.IsEnable = false;

            }
            else
            {
                var fork1 = abnormal.Where(t => t.Id == item.CrnFork1).Any();
                if (fork1)
                {
                    // 货叉异常
                    crnForkInfo1.IsEnable = false;

                }
                var fork2 = abnormal.Where(t => t.Id == item.CrnFork2).Any();
                if (fork2)
                {
                    // 货叉异常
                    crnForkInfo2.IsEnable = false;

                }
            }
            pORcsEquipCrnForks.Add(crnForkInfo1);
            pORcsEquipCrnForks.Add(crnForkInfo2);
        });
        return pORcsEquipCrnForks;
    }
}
